package xijia.plus.docs.thymeleafuser.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import xijia.plus.docs.constant.RequestConst;
import xijia.plus.docs.manage.all.model.query.DocMenuQuery;
import xijia.plus.docs.manage.all.model.vo.DocConfigVO;
import xijia.plus.docs.manage.all.model.vo.DocInfoClientVO;
import xijia.plus.docs.manage.all.model.vo.DocMenuVO;
import xijia.plus.docs.manage.all.service.DocConfigService;
import xijia.plus.docs.manage.all.service.DocInfoService;
import xijia.plus.docs.manage.all.service.DocMenuService;
import xijia.plus.docs.thymeleafuser.properties.DocProperties;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
import java.util.Set;


/**
 * 逻辑层，页面渲染数据获取处理
 *
 * @author wangsong
 * @version 1.0.0
 * @mail 1720696548@qq.com
 * @date 2022/10/20 0020 14:55
 */
@Service
@Slf4j
public class BaseServiceImpl {

    @Autowired
    protected HttpServletRequest request;
    @Autowired
    protected DocConfigService docConfigService;
    @Autowired
    protected DocMenuService docMenuService;
    @Autowired
    protected DocInfoService docInfoService;

    @Autowired
    protected DocProperties docProperties;

    /**
     * 获取租户名称
     * 1、优先使用 请求头中的  tenantName 参数 (部署时使用此方式)
     * 2、请求头没有在使用 yml 中的 doc.tenantName 配置 (本地启动可指定)
     * 3、请求头没有并且 yml 中没有那么读取第一天数据源数据源，顺序按key 的 hash 排序
     * @return {@link String}
     */
    protected String getTenantName() {
        String tenantName = request.getHeader(RequestConst.DB);
        // log.info("tenantName: " + tenantName);
        if (StringUtils.isEmpty(tenantName)) {
            String ymlTenantName = docProperties.getTenantName();
            if (StringUtils.isNotEmpty(ymlTenantName)) {
                tenantName = ymlTenantName;
                log.info("没有在请求头中设置租户, 将使用默认使用 yml 配置租户: " + ymlTenantName);
            } else {
                Set<String> tenantNames = docConfigService.getTenantNames();
                tenantName = tenantNames.iterator().next();
                log.info("没有在请求头中设置租户, 默认使用第一条数据源: " + tenantName);
            }
        }
        return tenantName;
    }

    /**
     * 获取菜单数据
     * <p>
     * 获取顶部菜单：  menuMap.get(1).get(0).getMenus()
     * 获取底部菜单：  menuMap.get(2).get(0).getMenus()
     * </P>
     *
     * @author wangsong
     * @mail 1720696548@qq.com
     * @date 2022/10/28 0028 15:44
     * @version 1.0.0
     */
    protected List<DocMenuVO> getTree() {
        // 1、顶部菜单/底部菜单
        DocMenuQuery btMenuQuery = new DocMenuQuery();
        btMenuQuery.setDisable(0);
        btMenuQuery.setSort("sort");
        btMenuQuery.setOrder("asc");
        return docMenuService.tree(this.getTenantName(), btMenuQuery);
    }


    /**
     * 获取分类数据
     * <p>
     * 获取顶部菜单：  menuMap.get(1).get(0).getMenus()
     * 获取底部菜单：  menuMap.get(2).get(0).getMenus()
     * </P>
     *
     * @author wangsong
     * @mail 1720696548@qq.com
     * @date 2022/10/28 0028 15:44
     * @version 1.0.0
     */
    protected Map<Integer, List<DocInfoClientVO>> getDocTree() {
        return docInfoService.clientTree(this.getTenantName());
    }

    /**
     * 获取 全局配置内容 字符串
     *
     * @return com.alibaba.fastjson.JSONObject
     * @author wangsong
     * @date 2022/10/28 0028 15:46
     * @version 1.0.0
     */
    protected String getConfig(String code) {
        DocConfigVO docConfigVO = docConfigService.findByCode(getTenantName(), code);
        return docConfigVO.getContent();
    }
}
